Вы сказали:
php просканировать папки найти все файлы с 0 размером и удалить А так же найти все файлы старше 65 дней и перенести в папку Old
Для того, чтобы просканировать папки, найти все файлы с нулевым размером и удалить их, а также перенести файлы старше 65 дней в папку Old, можно использовать следующий скрипт на PHP.
php<?php
// Укажите директорию для сканирования
$directory = '/путь/к/вашей/папке';
// Укажите папку, куда нужно перемещать старые файлы
$oldDirectory = '/путь/к/папке/Old';
// Создаем папку Old, если её нет
if (!is_dir($oldDirectory)) {
mkdir($oldDirectory, 0777, true);
}
// Получаем список файлов в указанной папке
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory),
RecursiveIteratorIterator::LEAVES_ONLY
);
foreach ($files as $file) {
// Пропускаем директории
if ($file->isDir()) {
continue;
}
// Проверяем, если размер файла 0
if ($file->getSize() == 0) {
// Удаляем файл с нулевым размером
unlink($file->getRealPath());
echo "Удалён файл с нулевым размером: " . $file->getRealPath() . "\n";
}
// Проверяем, если файл старше 65 дней
$fileModificationTime = $file->getMTime();
if (time() - $fileModificationTime > 65 * 86400) { // 65 дней в секундах
// Перемещаем файл в папку Old
$destination = $oldDirectory . DIRECTORY_SEPARATOR . $file->getFilename();
rename($file->getRealPath(), $destination);
echo "Перемещён файл в папку Old: " . $destination . "\n";
}
}
?>
Сканирование папки:
RecursiveDirectoryIterator для рекурсивного обхода файлов в указанной директории и всех её подкаталогах.Удаление файлов с нулевым размером:
getSize(). Если размер файла равен нулю, файл удаляется с помощью unlink().Перемещение файлов старше 65 дней:
getMTime(). Если разница между текущим временем и временем модификации больше 65 дней, файл переносится в папку Old с помощью rename().Создание папки Old (если не существует):
Old не существует, она будет создана с помощью mkdir().Вот альтернативный вариант PHP-скрипта, который не использует объектно-ориентированного подхода с классами, а работает только с функциями. Этот скрипт будет рекурсивно искать файлы с нулевым размером и удалять их, а также переносить файлы старше 65 дней в папку Old.
php<?php
// Укажите директорию для сканирования
$directory = '/путь/к/вашей/папке';
// Укажите папку, куда нужно перемещать старые файлы
$oldDirectory = '/путь/к/папке/Old';
// Создаем папку Old, если её нет
if (!is_dir($oldDirectory)) {
mkdir($oldDirectory, 0777, true);
}
// Рекурсивная функция для сканирования директорий
function scanDirectory($dir) {
// Открываем директорию
$files = scandir($dir);
// Проходим по всем файлам и папкам в директории
foreach ($files as $file) {
// Пропускаем . и ..
if ($file == '.' || $file == '..') {
continue;
}
$filePath = $dir . DIRECTORY_SEPARATOR . $file;
// Если это директория, вызываем функцию рекурсивно
if (is_dir($filePath)) {
scanDirectory($filePath);
} else {
// Проверяем размер файла
if (filesize($filePath) == 0) {
// Удаляем файл с нулевым размером
unlink($filePath);
echo "Удалён файл с нулевым размером: " . $filePath . "\n";
}
// Проверяем возраст файла (старше 65 дней)
if (time() - filemtime($filePath) > 65 * 86400) { // 65 дней в секундах
// Перемещаем файл в папку Old
$destination = $oldDirectory . DIRECTORY_SEPARATOR . $file;
rename($filePath, $destination);
echo "Перемещён файл в папку Old: " . $destination . "\n";
}
}
}
}
// Запускаем сканирование с указанной директории
scanDirectory($directory);
?>
Функция scanDirectory:
scandir().filesize(). Если файл имеет нулевой размер, он удаляется с помощью unlink().Old с помощью rename().Рекурсивный обход директорий:
Удаление и перемещение файлов:
Old.Создание папки Old:
Old ещё не существует, она будет создана с помощью mkdir().Для создания GIF из нескольких изображений (например, JPG и PNG) с использованием gif.js и PHP, можно организовать следующий процесс:
gif.js: Используем библиотеку gif.js для создания GIF в браузере.gif.js для создания GIF)html<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Создание GIF из изображений</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/gif.js/0.2.0/gif.min.js"></script>
</head>
<body>
<h1>Создание GIF из изображений</h1>
<form id="uploadForm" enctype="multipart/form-data">
<label for="images">Выберите изображения (JPG, PNG):</label>
<input type="file" name="images[]" id="images" accept="image/jpg, image/jpeg, image/png" multiple required>
<br><br>
<input type="submit" value="Создать GIF">
</form>
<div id="gifResult" style="display:none;">
<h2>Ваш GIF:</h2>
<img id="resultGif" alt="Созданный GIF">
<br>
<a id="downloadLink" href="#" download>Скачать GIF</a>
<br>
<h3>Для встраивания в сайт:</h3>
<textarea id="embedCode" readonly rows="3" cols="50"></textarea>
</div>
<script src="script.js"></script>
</body>
</html>
javascriptdocument.getElementById('uploadForm').addEventListener('submit', function(event) {
event.preventDefault();
const files = document.getElementById('images').files;
if (files.length < 2) {
alert('Пожалуйста, выберите минимум два изображения.');
return;
}
const gif = new GIF({
workers: 2,
quality: 10,
width: 500,
height: 500
});
// Загружаем изображения в GIF
Array.from(files).forEach(file => {
const img = new Image();
img.onload = function() {
gif.addFrame(img, {delay: 500, copy: true});
if (gif.frames.length === files.length) {
gif.render();
}
};
img.src = URL.createObjectURL(file);
});
// Когда GIF готов, показываем его и генерируем ссылку
gif.on('finished', function(blob) {
const gifUrl = URL.createObjectURL(blob);
const resultGif = document.getElementById('resultGif');
const downloadLink = document.getElementById('downloadLink');
const embedCode = document.getElementById('embedCode');
resultGif.src = gifUrl;
resultGif.style.display = 'block';
downloadLink.href = gifUrl;
embedCode.value = `<img src="${gifUrl}" alt="Created GIF">`;
document.getElementById('gifResult').style.display = 'block';
});
});
Этот файл будет получать изображение с клиента (GIF в base64) и сохранять его на сервере.
php<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['gif'])) {
// Директория для сохранения GIF
$uploadDir = 'uploads/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
// Получаем имя файла и путь
$fileName = 'created_gif_' . time() . '.gif';
$filePath = $uploadDir . $fileName;
// Перемещаем загруженный GIF в нужную папку
if (move_uploaded_file($_FILES['gif']['tmp_name'], $filePath)) {
// Успешная загрузка
echo json_encode([
'status' => 'success',
'file' => $filePath
]);
} else {
echo json_encode([
'status' => 'error',
'message' => 'Ошибка при загрузке файла.'
]);
}
}
?>
Создание GIF:
gif.js, которая позволяет создавать GIF из изображений, загруженных пользователем.Сохранение на сервере:
uploads/.Отображение и скачивание:
index.html в браузере.uploads/ есть разрешения на запись.Теперь у вас есть полное решение для создания GIF из изображений с помощью gif.js на клиенте и PHP для сохранения и предоставления ссылок.
Ошибка Uncaught SyntaxError: Unexpected token в файле gif.worker.js обычно возникает, когда файл JavaScript не может быть правильно интерпретирован браузером. Это может происходить по нескольким причинам, таким как:
gif.worker.js может быть загружен неправильно или поврежден.gif.worker.js, если файл не был правильно загружен или был поврежден на сервере.gif.worker.jsЕсли проблема возникает при загрузке библиотеки с CDN, попробуйте использовать локальную версию gif.worker.js. Библиотека gif.js состоит из нескольких файлов, и в некоторых случаях браузер может не загружать gif.worker.js из CDN корректно.
Для этого выполните следующие шаги:
Скачайте gif.js и gif.worker.js:
gif.js и gif.worker.js.Положите их на сервер:
gif.js и gif.worker.js) и разместите их в своей проектной структуре.Обновите пути к скриптам в HTML: В вашем HTML файле измените ссылки на локальные версии файлов:
html<script src="path/to/gif.js"></script>
<script src="path/to/gif.worker.js"></script>
Убедитесь, что указанный путь правильный, и что сервер правильно обслуживает эти файлы.
gif.worker.jsЕсли вы уже используете локальную версию gif.worker.js и ошибка сохраняется, попробуйте открыть файл и проверить его содержимое. Иногда сервер может отправлять файлы с неверным типом контента (например, с типом text/html вместо application/javascript), что приведет к синтаксическим ошибкам.
Если файл gif.worker.js выглядит подозрительно, попробуйте перезагрузить его с другого источника или вручную.
Если вы хотите продолжить использовать CDN, попробуйте другой источник для загрузки gif.js и gif.worker.js. Например:
html<script src="https://cdn.jsdelivr.net/npm/gif.js@0.2.0/dist/gif.min.js"></script>
Этот CDN может работать без ошибок, если проблема связана с предыдущим сервером.
Проверьте консоль браузера на дополнительные ошибки, которые могут указать на причину проблемы. Иногда дополнительные сообщения об ошибках могут подсказать, что не так с загружаемыми файлами.
Если ошибка все еще не исчезает, вы можете попробовать явно установить worker, указывая путь к нему:
javascriptvar gif = new GIF({
workers: 2,
quality: 10,
width: 500,
height: 500,
workerScript: 'path/to/gif.worker.js' // Укажите путь к worker.js
});
Это может помочь явно указать путь к рабочему файлу для браузера, чтобы избежать ошибок загрузки.
gif.js и gif.worker.js.gif.worker.js.Если проблема сохраняется, напишите, и я помогу вам дальше разобраться.
Да, вы можете создать GIF из изображений с использованием Node.js и PHP без использования gif.js. Вместо этого можно использовать более мощные серверные библиотеки, такие как sharp (для обработки изображений) и gifencoder (для создания GIF). В PHP вы можете использовать библиотеку imagick, которая предоставляет хорошие инструменты для работы с изображениями, включая создание GIF.
В Node.js можно использовать библиотеку gifencoder для создания GIF из изображений. Также можно использовать sharp для предварительной обработки изображений перед созданием GIF.
bashnpm install gifencoder sharp
javascriptconst fs = require('fs');
const path = require('path');
const gifEncoder = require('gifencoder');
const sharp = require('sharp');
const inputDir = './input_images'; // Папка с изображениями
const outputGifPath = './output/created.gif';
// Получаем список всех изображений в папке
fs.readdir(inputDir, (err, files) => {
if (err) {
console.error('Ошибка при чтении директории:', err);
return;
}
// Фильтруем только изображения (JPG, PNG)
const imageFiles = files.filter(file => /\.(jpg|jpeg|png)$/i.test(file));
if (imageFiles.length < 2) {
console.log('Необходимо минимум два изображения.');
return;
}
// Создаем GIF-энкодер
const encoder = new gifEncoder(500, 500); // Размеры GIF
encoder.createReadStream().pipe(fs.createWriteStream(outputGifPath));
encoder.start();
encoder.setDelay(500); // Задержка между кадрами (в миллисекундах)
encoder.setRepeat(0); // 0 — бесконечное повторение GIF
// Обрабатываем каждое изображение
imageFiles.forEach(file => {
const filePath = path.join(inputDir, file);
sharp(filePath)
.resize(500, 500) // Приводим изображения к нужному размеру
.toBuffer()
.then(data => {
// Добавляем изображение в GIF
encoder.addFrame(data);
})
.catch(err => {
console.error('Ошибка при обработке изображения:', err);
});
});
// Завершаем создание GIF
encoder.finish();
console.log('GIF создан и сохранен в', outputGifPath);
});
input_images.sharp для изменения размера изображений до нужного формата.gifencoder для создания GIF с добавлением изображений и настройкой задержки между кадрами.output/created.gif.В PHP можно использовать Imagick — мощную библиотеку для работы с изображениями, которая поддерживает создание GIF.
Убедитесь, что у вас установлен Imagick для PHP. Если он не установлен, вы можете установить его с помощью команды:
bashsudo apt-get install php-imagick
php<?php
$inputDir = 'input_images'; // Папка с изображениями
$outputGifPath = 'output/created.gif';
// Получаем все изображения из папки
$imageFiles = glob($inputDir . '/*.{jpg,jpeg,png}', GLOB_BRACE);
if (count($imageFiles) < 2) {
die("Необходимо минимум два изображения.");
}
// Создаем объект Imagick для GIF
$imagick = new Imagick();
// Открываем каждое изображение и добавляем его в GIF
foreach ($imageFiles as $file) {
$img = new Imagick($file);
$img->resizeImage(500, 500, Imagick::FILTER_LANCZOS, 1); // Изменяем размер
$imagick->addImage($img);
$imagick->setImageDelay(100); // Задержка между кадрами (в сотых долях секунды)
}
// Сохраняем GIF
$imagick->setImageFormat('gif');
$imagick->writeImages($outputGifPath, true);
echo "GIF создан и сохранен в $outputGifPath\n";
?>
input_images.Imagick, затем добавляется в основной объект GIF.output/created.gif.Чтобы пользователи могли загружать изображения для создания GIF, можно использовать простую HTML-форму с загрузкой файлов и передачей их на сервер.
html<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Создать GIF</title>
</head>
<body>
<h1>Создать GIF из изображений</h1>
<form action="upload.php" method="POST" enctype="multipart/form-data">
<label for="images">Выберите изображения (JPG, PNG):</label>
<input type="file" name="images[]" id="images" accept="image/jpg, image/jpeg, image/png" multiple required>
<br><br>
<input type="submit" value="Загрузить и создать GIF">
</form>
</body>
</html>
php<?php
$uploadDir = 'input_images/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['images'])) {
$uploadedFiles = $_FILES['images'];
$fileCount = count($uploadedFiles['name']);
// Проверяем, что хотя бы два изображения были загружены
if ($fileCount < 2) {
die("Пожалуйста, загрузите хотя бы два изображения.");
}
// Перемещаем загруженные файлы в папку
for ($i = 0; $i < $fileCount; $i++) {
$tmpName = $uploadedFiles['tmp_name'][$i];
$fileName = basename($uploadedFiles['name'][$i]);
$destination = $uploadDir . $fileName;
if (!move_uploaded_file($tmpName, $destination)) {
echo "Ошибка при загрузке файла $fileName.";
}
}
// После загрузки изображений, можно вызвать функцию для создания GIF
header('Location: create_gif.php');
exit;
}
?>
Этот файл будет вызывать PHP-скрипт для создания GIF из загруженных изображений. Можете использовать код на PHP, описанный ранее.
gifencoder и sharp для создания GIF из изображений.Imagick для создания GIF.Вы можете выбрать решение, которое наиболее подходит для вашего проекта.
Для того чтобы использовать Node.js и PHP вместе для создания GIF, где PHP будет отвечать за загрузку изображений, а Node.js — за создание GIF, нужно наладить коммуникацию между этими двумя средами. Обычно для этого можно использовать HTTP-запросы, где PHP будет отправлять изображения на сервер Node.js, а Node.js будет создавать GIF и отправлять его обратно в PHP.
Создадим форму для загрузки изображений на сервер через PHP.
html<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Загрузка изображений для создания GIF</title>
</head>
<body>
<h1>Загрузите изображения для создания GIF</h1>
<form action="upload.php" method="POST" enctype="multipart/form-data">
<label for="images">Выберите изображения (JPG, PNG):</label>
<input type="file" name="images[]" id="images" accept="image/jpg, image/jpeg, image/png" multiple required>
<br><br>
<input type="submit" value="Загрузить и создать GIF">
</form>
</body>
</html>
После загрузки изображений с помощью формы, PHP скрипт обработает файлы и отправит их в Node.js.
upload.php:
php<?php
$uploadDir = 'input_images/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['images'])) {
$uploadedFiles = $_FILES['images'];
$fileCount = count($uploadedFiles['name']);
// Проверяем, что хотя бы два изображения были загружены
if ($fileCount < 2) {
die("Пожалуйста, загрузите хотя бы два изображения.");
}
// Перемещаем загруженные файлы в папку
$filePaths = [];
for ($i = 0; $i < $fileCount; $i++) {
$tmpName = $uploadedFiles['tmp_name'][$i];
$fileName = basename($uploadedFiles['name'][$i]);
$destination = $uploadDir . $fileName;
if (move_uploaded_file($tmpName, $destination)) {
$filePaths[] = $destination;
} else {
echo "Ошибка при загрузке файла $fileName.";
}
}
// Отправляем изображения в Node.js для создания GIF
$url = 'http://localhost:3000/create-gif'; // Адрес сервера Node.js
$ch = curl_init($url);
$postFields = [
'images' => new CURLFile(implode(',', $filePaths)) // Объединяем пути к файлам для отправки
];
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
$response = curl_exec($ch);
if ($response === false) {
echo 'Ошибка запроса: ' . curl_error($ch);
}
curl_close($ch);
// Получаем путь к созданному GIF и сохраняем его для пользователя
$responseData = json_decode($response, true);
if (isset($responseData['gifPath'])) {
echo "GIF успешно создан! <a href='{$responseData['gifPath']}' download>Скачать GIF</a>";
} else {
echo "Ошибка при создании GIF.";
}
}
?>
Создадим сервер на Node.js, который будет принимать изображения от PHP, создавать GIF и отправлять результат обратно.
bashnpm install express gifencoder sharp multer
express: Фреймворк для работы с HTTP.gifencoder: Библиотека для создания GIF.sharp: Библиотека для работы с изображениями (например, изменение размера).multer: Библиотека для обработки загрузок файлов в Node.js.javascriptconst express = require('express');
const multer = require('multer');
const fs = require('fs');
const gifEncoder = require('gifencoder');
const sharp = require('sharp');
const path = require('path');
const app = express();
const port = 3000;
// Конфигурация multer для загрузки файлов
const upload = multer({ dest: 'uploads/' });
// Обработка запроса на создание GIF
app.post('/create-gif', upload.array('images'), (req, res) => {
const images = req.files;
if (images.length < 2) {
return res.status(400).json({ error: 'Необходимо минимум два изображения' });
}
const encoder = new gifEncoder(500, 500);
const gifPath = 'output/created.gif';
const writeStream = fs.createWriteStream(gifPath);
encoder.createReadStream().pipe(writeStream);
encoder.start();
encoder.setDelay(500); // Задержка между кадрами
encoder.setRepeat(0); // 0 - бесконечное повторение GIF
// Обрабатываем каждый файл и добавляем его в GIF
let processedCount = 0;
images.forEach(image => {
const imagePath = path.join(__dirname, image.path);
sharp(imagePath)
.resize(500, 500)
.toBuffer()
.then(buffer => {
encoder.addFrame(buffer);
processedCount++;
// После обработки всех изображений, завершаем создание GIF
if (processedCount === images.length) {
encoder.finish();
// Удаляем временные файлы
images.forEach(img => fs.unlinkSync(img.path));
res.json({ gifPath: '/' + gifPath }); // Отправляем путь к GIF
}
})
.catch(err => {
console.error(err);
res.status(500).json({ error: 'Ошибка при обработке изображения.' });
});
});
});
app.listen(port, () => {
console.log(`Сервер Node.js слушает на порту ${port}`);
});
index.html - форма для загрузки изображений (как было показано ранее).upload.php - PHP скрипт для обработки загрузки изображений и отправки их в Node.js.create_gif.php - скрипт для обработки результата, если нужно (например, для отображения или скачивания GIF).Запустите сервер Node.js:
bashnode server.js
Запустите ваш веб-сервер с PHP, например через Apache или встроенный сервер PHP:
bashphp -S localhost:8080
Теперь вы можете открыть index.html, загрузить изображения, и PHP отправит их в Node.js для создания GIF. После этого сервер Node.js вернет путь к созданному GIF, и PHP отобразит ссылку для скачивания.
Чтобы интегрировать CDN для jQuery и Bootstrap, а также добавить интерфейс для управления задержкой кадров для каждого изображения (параметр setDelay), нужно выполнить несколько шагов. Мы также добавим пользовательский интерфейс в форму для управления задержкой кадров для каждого изображения.
Для начала нужно подключить jQuery и Bootstrap через CDN в вашем HTML-файле.
html<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Загрузка изображений для создания GIF</title>
<!-- Подключаем Bootstrap CSS -->
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h1>Загрузите изображения для создания GIF</h1>
<form id="uploadForm" action="upload.php" method="POST" enctype="multipart/form-data">
<div class="form-group">
<label for="images">Выберите изображения (JPG, PNG):</label>
<input type="file" name="images[]" id="images" accept="image/jpg, image/jpeg, image/png" multiple required class="form-control">
</div>
<!-- Место для динамического добавления полей для задержки кадров -->
<div id="delaySection"></div>
<button type="submit" class="btn btn-primary">Загрузить и создать GIF</button>
</form>
</div>
<!-- Подключаем jQuery и Bootstrap JS через CDN -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js"></script>
<script>
// Обработчик для обновления поля задержки при добавлении изображений
$('#images').on('change', function() {
const files = this.files;
const delaySection = $('#delaySection');
delaySection.empty(); // Очищаем предыдущие поля
// Для каждого изображения добавляем поле для настройки задержки
for (let i = 0; i < files.length; i++) {
const fileName = files[i].name;
const fieldId = 'delay' + i;
delaySection.append(`
<div class="form-group">
<label for="${fieldId}">Задержка для ${fileName} (в миллисекундах):</label>
<input type="number" name="delay[${i}]" id="${fieldId}" class="form-control" value="500" min="0">
</div>
`);
}
});
</script>
</body>
</html>
setDelay) для каждого изображения.В PHP-скрипте нужно будет обработать задержки для каждого изображения и отправить их в Node.js.
php<?php
$uploadDir = 'input_images/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['images'])) {
$uploadedFiles = $_FILES['images'];
$fileCount = count($uploadedFiles['name']);
// Проверяем, что хотя бы два изображения были загружены
if ($fileCount < 2) {
die("Пожалуйста, загрузите хотя бы два изображения.");
}
// Перемещаем загруженные файлы в папку
$filePaths = [];
$delays = isset($_POST['delay']) ? $_POST['delay'] : [];
for ($i = 0; $i < $fileCount; $i++) {
$tmpName = $uploadedFiles['tmp_name'][$i];
$fileName = basename($uploadedFiles['name'][$i]);
$destination = $uploadDir . $fileName;
if (move_uploaded_file($tmpName, $destination)) {
$filePaths[] = ['path' => $destination, 'delay' => isset($delays[$i]) ? (int)$delays[$i] : 500];
} else {
echo "Ошибка при загрузке файла $fileName.";
}
}
// Отправляем изображения и задержки в Node.js для создания GIF
$url = 'http://localhost:3000/create-gif'; // Адрес сервера Node.js
$ch = curl_init($url);
$postFields = [
'images' => [],
'delays' => []
];
// Передаем файлы и их задержки
foreach ($filePaths as $file) {
$postFields['images'][] = new CURLFile($file['path']);
$postFields['delays'][] = $file['delay'];
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
$response = curl_exec($ch);
if ($response === false) {
echo 'Ошибка запроса: ' . curl_error($ch);
}
curl_close($ch);
// Получаем путь к созданному GIF и сохраняем его для пользователя
$responseData = json_decode($response, true);
if (isset($responseData['gifPath'])) {
echo "GIF успешно создан! <a href='{$responseData['gifPath']}' download>Скачать GIF</a>";
} else {
echo "Ошибка при создании GIF.";
}
}
?>
delay) для каждого изображения, который приходит через форму.В Node.js нужно будет обработать задержку для каждого кадра GIF.
javascriptconst express = require('express');
const multer = require('multer');
const fs = require('fs');
const gifEncoder = require('gifencoder');
const sharp = require('sharp');
const path = require('path');
const app = express();
const port = 3000;
// Конфигурация multer для загрузки файлов
const upload = multer({ dest: 'uploads/' });
// Обработка запроса на создание GIF
app.post('/create-gif', upload.array('images'), (req, res) => {
const images = req.files;
const delays = req.body.delays || [];
if (images.length < 2) {
return res.status(400).json({ error: 'Необходимо минимум два изображения' });
}
const encoder = new gifEncoder(500, 500);
const gifPath = 'output/created.gif';
const writeStream = fs.createWriteStream(gifPath);
encoder.createReadStream().pipe(writeStream);
encoder.start();
encoder.setRepeat(0); // 0 - бесконечное повторение GIF
// Обрабатываем каждый файл и добавляем его в GIF с заданной задержкой
let processedCount = 0;
images.forEach((image, index) => {
const imagePath = path.join(__dirname, image.path);
const delay = delays[index] || 500; // Если задержка не указана, по умолчанию 500 мс
sharp(imagePath)
.resize(500, 500)
.toBuffer()
.then(buffer => {
encoder.setDelay(delay); // Устанавливаем задержку для кадра
encoder.addFrame(buffer);
processedCount++;
// После обработки всех изображений, завершаем создание GIF
if (processedCount === images.length) {
encoder.finish();
// Удаляем временные файлы
images.forEach(img => fs.unlinkSync(img.path));
res.json({ gifPath: '/' + gifPath }); // Отправляем путь к GIF
}
})
.catch(err => {
console.error(err);
res.status(500).json({ error: 'Ошибка при обработке изображения.' });
});
});
});
app.listen(port, () => {
console.log(`Сервер Node.js слушает на порту ${port}`);
});
images мы берем соответствующую задержку из массива delays.setDelay библиотеки gifencoder.Для того чтобы добавить в интерфейс возможность указания имени для итогового файла GIF и отображения пути к файлу после его создания, необходимо внести несколько изменений как в интерфейс (HTML + jQuery), так и в обработку на стороне PHP и Node.js.
Добавим поле для ввода имени файла GIF и будем отображать путь к сохраненному GIF после его создания.
html<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Загрузка изображений для создания GIF</title>
<!-- Подключаем Bootstrap CSS -->
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container mt-5">
<h1>Загрузите изображения для создания GIF</h1>
<form id="uploadForm" action="upload.php" method="POST" enctype="multipart/form-data">
<div class="form-group">
<label for="images">Выберите изображения (JPG, PNG):</label>
<input type="file" name="images[]" id="images" accept="image/jpg, image/jpeg, image/png" multiple required class="form-control">
</div>
<!-- Место для динамического добавления полей для задержки кадров -->
<div id="delaySection"></div>
<!-- Поле для ввода имени файла GIF -->
<div class="form-group">
<label for="gifName">Введите имя файла GIF (без расширения):</label>
<input type="text" id="gifName" name="gifName" class="form-control" placeholder="Введите имя файла GIF" required>
</div>
<button type="submit" class="btn btn-primary">Загрузить и создать GIF</button>
</form>
<!-- Место для отображения результата -->
<div id="resultSection" class="mt-4" style="display: none;">
<h3>GIF успешно создан!</h3>
<p>Ссылка для скачивания: <a id="downloadLink" href="" download>Скачать GIF</a></p>
<p>Путь к файлу: <span id="gifPath"></span></p>
</div>
</div>
<!-- Подключаем jQuery и Bootstrap JS через CDN -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/js/bootstrap.bundle.min.js"></script>
<script>
// Обработчик для обновления поля задержки при добавлении изображений
$('#images').on('change', function() {
const files = this.files;
const delaySection = $('#delaySection');
delaySection.empty(); // Очищаем предыдущие поля
// Для каждого изображения добавляем поле для настройки задержки
for (let i = 0; i < files.length; i++) {
const fileName = files[i].name;
const fieldId = 'delay' + i;
delaySection.append(`
<div class="form-group">
<label for="${fieldId}">Задержка для ${fileName} (в миллисекундах):</label>
<input type="number" name="delay[${i}]" id="${fieldId}" class="form-control" value="500" min="0">
</div>
`);
}
});
// Обработчик отправки формы
$('#uploadForm').on('submit', function(e) {
e.preventDefault(); // Отменяем стандартную отправку формы
const formData = new FormData(this);
// Отправка формы через AJAX
$.ajax({
url: 'upload.php',
type: 'POST',
data: formData,
processData: false, // Не обрабатываем данные
contentType: false, // Не устанавливаем тип контента
success: function(response) {
const responseData = JSON.parse(response);
if (responseData.success) {
// Показываем результат
$('#resultSection').show();
$('#downloadLink').attr('href', responseData.gifPath);
$('#gifPath').text(responseData.gifPath);
} else {
alert('Ошибка при создании GIF.');
}
},
error: function() {
alert('Произошла ошибка при отправке запроса.');
}
});
});
</script>
</body>
</html>
gifName).Теперь нужно передавать и обрабатывать имя файла GIF, которое вводит пользователь, и включать его в путь к файлу.
php<?php
$uploadDir = 'input_images/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0777, true);
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['images'])) {
$uploadedFiles = $_FILES['images'];
$fileCount = count($uploadedFiles['name']);
// Проверяем, что хотя бы два изображения были загружены
if ($fileCount < 2) {
die("Пожалуйста, загрузите хотя бы два изображения.");
}
// Проверяем, что имя файла GIF указано
$gifName = isset($_POST['gifName']) ? basename($_POST['gifName']) : 'output';
if (empty($gifName)) {
die("Пожалуйста, укажите имя файла GIF.");
}
// Перемещаем загруженные файлы в папку
$filePaths = [];
$delays = isset($_POST['delay']) ? $_POST['delay'] : [];
for ($i = 0; $i < $fileCount; $i++) {
$tmpName = $uploadedFiles['tmp_name'][$i];
$fileName = basename($uploadedFiles['name'][$i]);
$destination = $uploadDir . $fileName;
if (move_uploaded_file($tmpName, $destination)) {
$filePaths[] = ['path' => $destination, 'delay' => isset($delays[$i]) ? (int)$delays[$i] : 500];
} else {
echo "Ошибка при загрузке файла $fileName.";
}
}
// Отправляем изображения и задержки в Node.js для создания GIF
$url = 'http://localhost:3000/create-gif'; // Адрес сервера Node.js
$ch = curl_init($url);
$postFields = [
'images' => [],
'delays' => [],
'gifName' => $gifName . '.gif' // Передаем имя GIF
];
// Передаем файлы и их задержки
foreach ($filePaths as $file) {
$postFields['images'][] = new CURLFile($file['path']);
$postFields['delays'][] = $file['delay'];
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
$response = curl_exec($ch);
if ($response === false) {
echo 'Ошибка запроса: ' . curl_error($ch);
}
curl_close($ch);
// Получаем путь к созданному GIF и сохраняем его для пользователя
$responseData = json_decode($response, true);
if (isset($responseData['gifPath'])) {
echo json_encode(['success' => true, 'gifPath' => $responseData['gifPath']]);
} else {
echo json_encode(['success' => false]);
}
}
?>
gifName.Теперь нужно передать имя файла в Node.js, чтобы сохранить GIF с заданным именем.
javascriptconst express = require('express');
const multer = require('multer');
const fs = require('fs');
const gifEncoder = require('gifencoder');
const sharp = require('sharp');
const path = require('path');
const app = express();
const port = 3000;
// Конфигурация multer для загрузки файлов
const upload = multer({ dest: 'uploads/' });
// Обработка запроса на создание GIF
app.post('/create-gif', upload.array('images'), (req, res) => {
const images = req.files;
const delays = req.body.delays || [];
const gifName = req.body.gifName || 'output.gif'; // Получаем имя GIF
if (images.length < 2) {
return res.status(400).json({ error: 'Необходимо минимум два изображения' });
}
const encoder = new gifEncoder(500, 500);
const gifPath = path.join(__dirname, 'output', gifName);
const writeStream = fs.createWriteStream(gifPath);
encoder.createReadStream().pipe(writeStream);
encoder.start();
encoder.setRepeat(0); // 0 - бесконечное повторение GIF
// Обрабатываем каждый файл и добавляем его в GIF с заданной задержкой
let processedCount = 0;
images.forEach((image, index) => {
const imagePath = path.join(__dirname, image.path);
const delay = delays[index] || 500; // Если задержка не указана, по умолчанию 500 мс
sharp(imagePath)
.resize(500, 500)
.toBuffer()
.then(buffer => {
encoder.setDelay(delay); // Устанавливаем задержку для кадра
encoder.addFrame(buffer);
processedCount++;
// После обработки всех изображений, завершаем создание GIF
if (processedCount === images.length) {
encoder.finish();
// Удаляем временные файлы
images.forEach(img => fs.unlinkSync(img.path));
res.json({ gifPath: '/' + gifPath }); // Отправляем путь к GIF
}
})
.catch(err => {
console.error(err);
res.status(500).json({ error: 'Ошибка при обработке изображения.' });
});
});
});
app.listen(port, () => {
console.log(`Сервер Node.js слушает на порту ${port}`);
});
gifName), которое было передано через PHP.output.